/**
 ******************************************************************************
 * @file           : bsp_rs485.h
 * @brief          : RS485 Driver Header File (STM32F4xx)
 ******************************************************************************
 * @attention
 *
 * RS485驱动头文件
 * 基于USART实现半双工通信
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_RS485_H
#define __BSP_RS485_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "./BSP/RS485/bsp_rs485_config.h"

/* Exported types ------------------------------------------------------------*/

/**
 * @brief RS485错误码枚举
 */
typedef enum
{
    RS485_OK = 0,                   /*!< 成功 */
    RS485_ERROR_PARAM,              /*!< 参数错误 */
    RS485_ERROR_TIMEOUT,            /*!< 超时 */
    RS485_ERROR_BUSY,               /*!< 总线忙 */
    RS485_ERROR_HAL                 /*!< HAL库错误 */
} RS485_Error_e;

/**
 * @brief RS485状态枚举
 */
typedef enum
{
    RS485_STATE_IDLE = 0,           /*!< 空闲状态 */
    RS485_STATE_TX,                 /*!< 发送状态 */
    RS485_STATE_RX,                 /*!< 接收状态 */
    RS485_STATE_ERROR               /*!< 错误状态 */
} RS485_State_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化和去初始化 */
void rs485_init(uint32_t baudrate);
void rs485_deinit(void);

/* 发送函数 */
void rs485_send_byte(uint8_t data);
void rs485_send_bytes(const uint8_t *buf, uint16_t len);
void rs485_send_string(const char *str);

/* 接收函数 */
uint16_t rs485_get_rx_count(void);
uint8_t rs485_read_byte(void);
uint16_t rs485_read_bytes(uint8_t *buf, uint16_t len);
void rs485_flush_rx_buffer(void);

/* 状态查询函数 */
RS485_Error_e rs485_get_last_error(void);
RS485_State_e rs485_get_state(void);

/* 调试接口 */
void rs485_print_status(void);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_RS485_H */
